<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
     function Fn(){
        // {}
        // {}[[Prototype]] = Fn.prototype; (所有的实例化对象同可以通过原型属性 -> 访问构造函数的原型对象(动态方法))
        // this -> {}
        console.log("this",this);

        // return this;
    }

    var res = new Fn();
    console.log("实例化对象",res);

    // 所有的实例化对象都有原型属性[[Prototype]] 指向创建它的构造函数的原型对象

    console.log(res.__proto__ === Fn.prototype);

    // 原型对象本质上也是一个对象(实例化对象) => 都有原型属性[[Prototype]] 指向创建它的构造函数的原型对象
    console.log("原型对象",Fn.prototype);
    console.log(Fn.prototype.__proto__ === Object.prototype);

    // 按照上述推论  =>  矛盾 (如果在Object.prototype上找不到属性 -> 还会继续找自己 -> 递归式查找->死递归)
    //  console.log(Object.prototype.__proto__ === Object.prototype);  // false

    // 官方强制要求   Object.prototype.__proto__ === null  => 如果Object原型对象上找不到 -> 不在继续向后查找 =>undefined
    console.log("Object的原型对象",Object.prototype);
    console.log(Object.prototype.__proto__ === null);

    // 原型链
    // 实例化对象  -> 构造函数的原型对象  -> .... -> Object.prototype -> null  

    














</script>
</html>